package model.Usuario;
import java.util.ArrayList;
import java.util.List;


import model.Publicacion.Pregunta;
import model.Publicacion.Publicacion;
import model.Publicacion.Respuesta;
import model.votoYfav.Favorito;
import model.votoYfav.Voto;




public abstract class Usuario
{
	
	
	
		
	protected List<Voto> votos;

	protected List<Respuesta> respuestas;
	
	protected List<Favorito> favoritos;
	
	
	public Usuario(){
		votos=new ArrayList<Voto>();
		respuestas=new ArrayList<Respuesta>();
		favoritos=new ArrayList<Favorito>();
	}

	
	
	public abstract double factorDeRegularidad() ;
	
	
	
	public abstract double puntajePorActividad();
	
	
	
	public int cantidadDeVotosPositivos() {
		int cantidad=0;
		for(Voto v:votos)
		{
			if(v.aFavor())
			{
				cantidad++;
			}
		}
		return cantidad;	
	}
	
	
	
	public int cantidadDeVotosNegativos() {
		
		int cantidad=0;
		for(Voto v:votos)
		{
			if(!v.aFavor())
			{
				cantidad++;
			}
		}
		return cantidad;	
	}
	
	
	
	public int cantidadDeFavoritos() {
		
		return favoritos.size();	
	}
	
	
	
	public void responderApregunta(Pregunta pregunta, Respuesta respuesta) {
		respuestas.add(respuesta);
		pregunta.agregarRespuesta(respuesta);
	}
	
	
	
	public double ranking() {
		
		return puntajePorActividad()*factorDeRegularidad();	
	}
	
	
	
	public void votarPublicacion(Publicacion publicacion, Voto voto) {
			
		
		  publicacion.sumarVoto(voto);
		  this.votos.add(voto);  
		  
		
		  
	}
	
	
	
	public void ponerFavorito(Publicacion publicacion) {
		Favorito f = new Favorito(this,publicacion);
		publicacion.SumarFavorito(f);
		this.favoritos.add(f);
		
	}
	
	
	
	public void sacarVoto(Publicacion publicacion) {
		publicacion.sacarVotoDe(this);
		
	}
	
	public void eliminarVoto(Voto v) {
		this.votos.remove(v);
		
	}

	
	
	public void sacarFavorito(Publicacion publicacion) {
		publicacion.sacarFavoritoDe(this);	
	}
	
	public void eliminarFavorito(Favorito f) {
		this.favoritos.remove(f);
	}
	
	public List<Respuesta> getRespuestas()
	{
		return respuestas;
	}



	public void borrarRespuesta(Respuesta res) {
		
		res.eliminar();
	}



	public abstract List<Publicacion> getPublicaciones();
	
	public int cantDeVotos()
	{
		return votos.size();
	}



	public int cantidadDeRespuestas() {
		int cant=0;
		for(Respuesta r:respuestas)
		{
			if(!r.estaEliminada())
			{
				cant++;
			}
		}
		return cant;
	}







	
	
}

